package com.eduagent.xwqeduagent.utils.oj;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * 在线评测服务接口
 */
public interface JudgeService {

    /**
     * 检查认证是否有效
     * @return 认证是否有效
     */
    boolean checkAuthentication();

    /**
     * 检查授权是否有效
     * @return 授权是否有效
     */
    boolean checkAuthorization();

    /**
     * 提交代码进行评测（使用语言ID）
     * @param sourceCode 源代码
     * @param languageId 语言ID
     * @param stdin 标准输入
     * @param expectedOutput 期望输出
     * @param wait 是否等待结果
     * @return 评测结果
     * @throws IOException 网络错误
     */
    JudgeSubmissionResponse submitCode(String sourceCode, int languageId, String stdin, String expectedOutput, boolean wait) throws IOException;

    /**
     * 提交代码进行评测（使用语言名称）
     * @param sourceCode 源代码
     * @param language 语言名称
     * @param stdin 标准输入
     * @param expectedOutput 期望输出
     * @param wait 是否等待结果
     * @return 评测结果
     * @throws IOException 网络错误
     */
    JudgeSubmissionResponse submitCode(String sourceCode, String language, String stdin, String expectedOutput, boolean wait) throws IOException;

    /**
     * 提交多文件代码进行评测
     * @param mainFile 主文件路径
     * @param additionalFiles 附加文件路径列表
     * @param compileScript 编译脚本
     * @param runScript 运行脚本
     * @param stdin 标准输入
     * @param expectedOutput 期望输出
     * @param wait 是否等待结果
     * @return 评测结果
     * @throws IOException 网络错误
     */
    JudgeSubmissionResponse submitMultiFiles(String mainFile, List<String> additionalFiles, String compileScript, String runScript, String stdin, String expectedOutput, boolean wait) throws IOException;

    /**
     * 批量提交代码
     * @param submissions 提交列表
     * @param wait 是否等待结果
     * @return 评测结果列表
     * @throws IOException 网络错误
     */
    List<JudgeSubmissionResponse> submitBatchCode(List<JudgeSubmission> submissions, boolean wait) throws IOException;

    /**
     * 获取评测结果
     * @param token 提交令牌
     * @return 评测结果
     * @throws IOException 网络错误
     */
    JudgeSubmissionResponse getSubmission(String token) throws IOException;

    /**
     * 获取评测结果（指定返回字段）
     * @param token 提交令牌
     * @param fields 需要返回的字段，以逗号分隔
     * @return 评测结果
     * @throws IOException 网络错误
     */
    JudgeSubmissionResponse getSubmission(String token, String fields) throws IOException;

    /**
     * 获取批量评测结果
     * @param tokens 提交令牌列表
     * @return 评测结果列表
     * @throws IOException 网络错误
     */
    List<JudgeSubmissionResponse> getBatchSubmissions(List<String> tokens) throws IOException;

    /**
     * 获取批量评测结果（指定返回字段）
     * @param tokens 提交令牌列表
     * @param fields 需要返回的字段，以逗号分隔
     * @return 评测结果列表
     * @throws IOException 网络错误
     */
    List<JudgeSubmissionResponse> getBatchSubmissions(List<String> tokens, String fields) throws IOException;

    /**
     * 删除评测提交
     * @param token 提交令牌
     * @return 是否成功
     * @throws IOException 网络错误
     */
    boolean deleteSubmission(String token) throws IOException;

    /**
     * 获取支持的编程语言列表
     * @return 语言名称到ID的映射
     */
    Map<String, Integer> getSupportedLanguages();

    /**
     * 根据语言名称获取语言ID
     * @param languageName 语言名称
     * @return 语言ID，如果不支持返回null
     */
    Integer getLanguageIdByName(String languageName);

    /**
     * 获取语言列表
     * @param all 是否包含所有语言（包括归档的）
     * @return 语言列表
     * @throws IOException 网络错误
     */
    Object getLanguagesList(boolean all) throws IOException;

    /**
     * 获取特定语言信息
     * @param languageId 语言ID
     * @return 语言信息
     * @throws IOException 网络错误
     */
    Object getLanguageInfo(int languageId) throws IOException;

    /**
     * 获取状态列表
     * @return 状态列表
     * @throws IOException 网络错误
     */
    Object getStatusList() throws IOException;

    /**
     * 获取系统信息
     * @return 系统信息
     * @throws IOException 网络错误
     */
    Object getSystemInfo() throws IOException;

    /**
     * 获取配置信息
     * @return 配置信息
     * @throws IOException 网络错误
     */
    Object getConfigInfo() throws IOException;

    /**
     * 获取统计信息
     * @param invalidateCache 是否刷新缓存
     * @return 统计信息
     * @throws IOException 网络错误
     */
    Object getStatistics(boolean invalidateCache) throws IOException;

    /**
     * 获取工作进程状态
     * @return 工作进程状态
     * @throws IOException 网络错误
     */
    Object getWorkers() throws IOException;

    /**
     * 获取关于信息
     * @return 关于信息
     * @throws IOException 网络错误
     */
    Object getAbout() throws IOException;

    /**
     * 获取版本信息
     * @return 版本信息
     * @throws IOException 网络错误
     */
    Object getVersion() throws IOException;

    /**
     * 获取许可证信息
     * @return 许可证信息
     * @throws IOException 网络错误
     */
    Object getLicense() throws IOException;
} 